package com.jt.common.filter;

import com.sun.prism.shader.FillEllipse_ImagePattern_Loader;

import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
//定义过滤器
interface Filter{
    //过滤方法
    boolean invoke();
}
//定义控制器
interface Servlte{
    //负责请求的分发
    void dispatch();
}
//定义过滤链
class FilterChain{
    //定义过滤器，可能有多个 不希望外界修改
    private final List<Filter> filters = new CopyOnWriteArrayList<>();
    //定义控制器 控制逻辑请求
    private Servlte servlte;

    public FilterChain(List<Filter> filters, Servlte servlte) {
        this.filters.addAll(filters);
        this.servlte = servlte;
    }

    //定义执行过滤链的方法
    public void doFilter(){
        for (int i = 0; i < filters.size(); i++) {
            if(!filters.get(i).invoke()) return;//判断其中的一个过滤方法是否通过
        }
        //通过则进行请求分发
        servlte.dispatch();
    }
}
//测试过滤链
public class FilterChainTests {
    public static void main(String[] args) {
        //过滤器对象
        Filter filter1 = new Filter() {
            @Override
            public boolean invoke() {
                System.out.println("filter 01");
                return true;
            }
        };
        Filter filter2 = new Filter() {
            @Override
            public boolean invoke() {
                System.out.println("filter 02");
                return true;
            }
        };
        List<Filter> filters = new CopyOnWriteArrayList<>();
        filters.add(filter1);
        filters.add(filter2);
        //控制器
        Servlte servlte = new Servlte() {
            @Override
            public void dispatch() {
                System.out.println("分发请求....");
            }
        };
        //执行请求过滤处理
        FilterChain fc = new FilterChain(filters,servlte);
        fc.doFilter();
    }
}
